import org.junit.Test;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
import java.util.Locale;
import java.util.Scanner;

/**
 * JavaSE:基础语法,Javaoop面向对象编程,JavaAPI(帮助文档,理解:字典)
 * [预计提供好的类库:8000,JavaApi只学重点]
 *
 * JavaAPI:字符串,包装类,集合[泛型],线程,多线程[并发--大数据],Io流,Socket套接字[网络编程]
 *
 * jdk1.8.chm帮助文档 理解:新华字典 会查类,接口,抽象..使用
 * JDK版本---帮助文档 根据用什么版本JDK,查对应版本帮助文档
 *
 * 必须会查API String类----什么包下?
 *             java.lang[默认:不需要导入包]
 *  java:错误:无效的源发行版:17
 *  maven项目:自动下载:JUnit版本--testing版本---testing级别[识别JDK17]
 *  调整Maven版本jdk
 *
 * JDK1.8
 */
public class StringAPI {
    /**
     * JDK1.8 StringAPI类库:构造器怎么用,方法怎么用?
     * 包位置:java.lang[不需要导入包:System,String]
     * 特点:不需要导入包,不可以继承,字符数组,定义完毕无法修改可以覆盖,String类是final,java字符串编码集
     * 顶级UniCode:GBK,UTF-8:任何字符对应2个字节
     * 字符串底层:封装了字符数组及针对字符数组的操作算法
     * 字符数组===字符串
     * 定义:String str ="直接量"; 给定值创建String字符串对象
     *      String str=new String()
     */
    @Test
    public void testString(){
      //  System.out.println("HEllo World");
        String str ="字符串";
        System.out.println(str);
        char[] c= {'字','符','串'};
        System.out.println(c);
        //字符串一旦创建出来,对象无法修改,因为String是final修饰
        String s="hello world";
         s="123";//对对象进行覆盖
        System.out.println(s);}
        /**
         * 定义给定值的方式:String str='java123'
         *                             静态字符串
         * 创建在String常量池中,对于重复创建静态字符串,JVM虚拟机首先
         *会在常量池中查找,
         * 存在String常量值
         *
         * 好处:减少内存开销,提高性能
         */
        @Test
        public void testStrings(){
            String s1="java123";
            String s2="java123";//不会创建对象,从常量池java123
            System.out.println(s1==s2);//true
            String s="java";//s对象 不可修改
            String s3=s+"123";//s3对象=s对象+"123" s3新对象
            System.out.println(s1==s3);//java123 ==java123 true
            String s4="java"+"123";
            //右侧:直接量方式拼接,静态字符串,存入常量池中
            System.out.println(s2==s4);
            //s2的java123从常量池中获取,s4拼接后静态字符串,从常量池中获取
            //---上面的代码,创建字符串对象方式
            //---上面的代码,给定值定义字符串方式:拥有常量值
            //---
            String s5=new String("java123");
            //
            System.out.println(s4==s5);

        }
    /**
     * String API方法
     * length方法 返回值int
     * 作用:返回当前字符串的长度(个数)---借鉴于数组length方法
     *特点:字符串包括:
     * String对象采用Unicode顶级编码,每个字符算一个,占两个字节
     */
    @Test
    public void testlength(){
        String str="HElloWorld";
        System.out.println(str.length());
    }
/**
 * indexof方法---重载功能:修饰符 返回值 方法名 一致
 *                                         参数一致
 * indexof(String index) 返回值:int
 * 第一个参数 String index:传入下标键
 * 作用
 */
@Test
    public void testIdexof(){
    String str="thinking in java";
    //
    int index =str.indexOf("ja");
    System.out.println("打印下标位:"+index);
    index=str.indexOf("ja");
    System.out.println("打印下标位:"+index);
    index=str.indexOf("in",3);
    //用处:查找指定某一位相同
    System.out.println("指定下标位:"+index);
    //lastIndexof()
    index=str.lastIndexOf("in");
    System.out.println("最后的下标位:"+index);

}
/**
 * StringAPI针对字符串提供三种方法:截取,替换,分割
 * subString重载方法  截取  返回值:String
 * subString(int)
 * 作用:截取字符串.从下标start位置开始截取,截取到end下标位置
 * subString(int index)
 * 作用:截取字符串,从下标index位置开始截取,截取到最后
 *
 */
@Test
    public void testSubString(){
    String url="www.baidu.com";//需求:通过截取字符串baidu
    url=url.substring(4,8);//
    System.out.println("截取子字符串:"+url);
    //需求:通过截取字符串.com
    url=url.substring(9);
    System.out.println("截取字符串,截取到最后"+url);
}
/**
 * charAt(in index)方法 返回值char
 * 作用:返回当前字符串中指定位置的字符
 * StringIndex 异常
 * 字符串下标越界异常---出现原因:下标超出范围
 */
@Test
    public void testCharAT() {
    String str ="thinking in java";
    char c=str.charAt(15);
    System.out.println("获取对应字符:"+c);
}
/**
 * trim方法 返回值 String
 * 作用:去掉当前字符串前后空格[转大小写叠加使用]
 * 统一转换大小写,去掉空格之后
 *
 * tolweCase用法 返回值String.0
 * 作用:将字符串中的字符转成小写
 * toUpperCase方法 返回值String
 * 作用 将字符串中的字符转成大写
 */
@Test
    public void testTrim(){
    String str="xD4e";
    //
    str=str.trim().toUpperCase();
    System.out.println("去掉空格:"+str);
}
/**
 * [php前端]正则表达式:语法-元子符 ^
 * 验证字符串
 * matches方法 返回值:Boolean
 * 作用:用于验证字符串,使用正则表达式进行验证[过滤字符]
 * 返回true正则验证成功,返回false正则验证失败
 */
public static void main(String[] args) {
    String regex="^\\d{15}|\\d{18}$";
    System.out.println( "请输入:");
    //从控制台输入[模拟用户输入] "123"
    Scanner input =new Scanner(System .in);
    //判断,如果正则通过,返回是数字,反之相反
    if(input.nextLine().matches(regex)){
        System.out.println("是正确身份证号");
    }else{
        System.out.println("不是正确的身份证号~");
    }
}
    /**
     * replace方法 替换 返回值:String
     * replace(String a,String b)
     * 第一个参数 String a 传入替换字符
     * 第二个参数 String b 传入查找字符
     * 作用:用于匹配字符串中存在字符,匹配成功,替换成字符
     */
    @Test
    public void testplace(){
        String str="我爱Java";//需求:Java替换Python
        str.replace("Java","Python");
        System.out.println("替换后的字符串:"+str);

        String regex="^[\\u4e00-\\u9fa5]{0,}$";
        String say="我去年买了块表";
        say=say.replaceAll(regex,"Python");
        System.out.println("替换后的字符串:"+say);


    }
    /**split方法 分割 返回值:String
     */
    @Test
    public void testSplit(){
        String url ="www.baidu.com";
        String[] urls=url.split(".");
        System.out.println(urls[1]);
        //思考:代码哪里出现错误 ArrayIndexOutOfBoundsException
        //打印字符串数组--增强for 数组数据类型 引用:遍历数组引用
        for(String s:urls){
            System.out.println("分割后元素值:"+s);
        }
    }
    /**
     * vauleof() 静态方法:通过类名访问 返回值:String
     * 作用:基础数据类型转换为字符串
     */
    @Test
    public void testValueOf(){
        int i=123;//基础数据类型转换为字符串
        String s=String.valueOf(i);
        if(s.equals("123")){//s对象=="123" 判断对象 false
            //s对象.equals("123") 判断值 true 没有实际值判断对象
            System.out.println("是字符串");
        }else{
            System.out.println("不是字符串");
        }
    }
    //String API 没有讲全-----会查API[电子商务]

    }



